import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import statsmodels.api as sm
url = 'https://drive.google.com/uc?id=15B-rNStFOTnIL9okkV1RxxgZHx9AU9KK'
df = pd.read_excel(url)
Show Data¶
# Show 5 first rows
df.head()
| Timestamp | ID | GENDER | SEMESTER | MAJOR | GPA | SALARY_EXPECT | AFTER_GRAD | COUNTRY_PREF | PROJECT_STYLE | WORK_STYLE | STRENGTH | CODE_LEVEL | LANGUAGES | FIELD_PREF_MAPPED | JOB_FACTOR_MAPPED | JOB_ASPIRATION_GROUPED | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 9/25/2025 18:42:51 | mtwitherr@gmail.com | SE181721 | Không muốn nêu cụ thể | 5 | Vi mạch | 7.600000 | 15000000 | Đi làm ngay | Đa quốc gia | Nhóm | Nhóm | Cả 2 | 3 | Tiếng Việt | Vi mạch | Thu nhập | Phát triển phần mềm |
| 1 | 9/26/2025 9:27:43 | thanhthanhc2314@gmail.com | SE194248 | Nam | 4 | Trí tuệ nhân tạo | 8.000000 | 15000000 | Vừa làm vừa học thêm chứng chỉ/chuyên môn | Đa quốc gia | Nhóm | Nhóm | Kỹ năng mềm (teamwork, thuyết trình, quản lý) | 3 | Đa ngôn ngữ | Kỹ thuật phần mềm | Thu nhập | Dữ liệu & Trí tuệ nhân tạo |
| 2 | 9/27/2025 7:48:43 | dotruongphat9@gmail.com | SE192883 | Nam | 4 | Kỹ thuật phần mềm | 7.600000 | 20000000 | Vừa làm vừa học thêm chứng chỉ/chuyên môn | Đa quốc gia | Nhóm | Nhóm | Cả 2 | 2 | Đa ngôn ngữ | Kỹ thuật phần mềm | Thu nhập | Dữ liệu & Trí tuệ nhân tạo |
| 3 | 9/27/2025 7:49:16 | dngochan89@gmail.com | SE190041 | Nữ | 3 | Trí tuệ nhân tạo | 7.400000 | 20000000 | Học tiếp Thạc sĩ/Tiến sĩ | Đa quốc gia | Nhóm | Nhóm | Kỹ năng mềm (teamwork, thuyết trình, quản lý) | 1 | Tiếng Việt | Kỹ thuật phần mềm | Môi trường chuyên nghiệp | Phát triển phần mềm |
| 4 | 9/27/2025 7:49:17 | nguyen20050303@gmail.com | SE190764 | Nam | 5 | Hệ thống thông tin | 5.157842 | 15000000 | Vừa làm vừa học thêm chứng chỉ/chuyên môn | Đa quốc gia | Cá nhân | Nhóm | Kỹ năng chuyên môn (lập trình, giải quyết kỹ t... | 3 | Đa ngôn ngữ | Kỹ thuật phần mềm | Sự ổn định | Phát triển phần mềm |
# Show dataset variables (grouped by columns)
df.count() # Liệt kê các biến và số lượng quan sát trong data frame "df"
| 0 | |
|---|---|
| Timestamp | 383 |
| 383 | |
| ID | 383 |
| GENDER | 383 |
| SEMESTER | 383 |
| MAJOR | 383 |
| GPA | 383 |
| SALARY_EXPECT | 383 |
| AFTER_GRAD | 383 |
| COUNTRY_PREF | 383 |
| PROJECT_STYLE | 383 |
| WORK_STYLE | 383 |
| STRENGTH | 383 |
| CODE_LEVEL | 383 |
| LANGUAGES | 383 |
| FIELD_PREF_MAPPED | 383 |
| JOB_FACTOR_MAPPED | 383 |
| JOB_ASPIRATION_GROUPED | 383 |
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 383 entries, 0 to 382 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Timestamp 383 non-null object 1 EMAIL 383 non-null object 2 ID 383 non-null object 3 GENDER 383 non-null object 4 SEMESTER 383 non-null int64 5 MAJOR 383 non-null object 6 GPA 383 non-null float64 7 SALARY_EXPECT 383 non-null int64 8 AFTER_GRAD 383 non-null object 9 COUNTRY_PREF 383 non-null object 10 PROJECT_STYLE 383 non-null object 11 WORK_STYLE 383 non-null object 12 STRENGTH 383 non-null object 13 CODE_LEVEL 383 non-null int64 14 LANGUAGES 383 non-null object 15 FIELD_PREF_MAPPED 383 non-null object 16 JOB_FACTOR_MAPPED 383 non-null object 17 JOB_ASPIRATION_GROUPED 383 non-null object dtypes: float64(1), int64(3), object(14) memory usage: 54.0+ KB
Handing Missing value¶
# Show missing values on data
print(df.isnull().sum()) #returns True if the value is missing
#df0.notnull().sum() #Returns True for non-missing values
Timestamp 0 EMAIL 0 ID 0 GENDER 0 SEMESTER 0 MAJOR 0 GPA 0 SALARY_EXPECT 0 AFTER_GRAD 0 COUNTRY_PREF 0 PROJECT_STYLE 0 WORK_STYLE 0 STRENGTH 0 CODE_LEVEL 0 LANGUAGES 0 FIELD_PREF_MAPPED 0 JOB_FACTOR_MAPPED 0 JOB_ASPIRATION_GROUPED 0 dtype: int64
# Kiểm tra toàn bộ dòng trùng lặp
duplicates = df[df.duplicated()]
# In ra số lượng dòng trùng
print(f"Số dòng trùng lặp: {df.duplicated().sum()}")
# Nếu bạn muốn xem chi tiết các dòng trùng:
print("\nCác dòng trùng lặp:")
print(duplicates)
Số dòng trùng lặp: 0 Các dòng trùng lặp: Empty DataFrame Columns: [Timestamp, EMAIL, ID, GENDER, SEMESTER, MAJOR, GPA, SALARY_EXPECT, AFTER_GRAD, COUNTRY_PREF, PROJECT_STYLE, WORK_STYLE, STRENGTH, CODE_LEVEL, LANGUAGES, FIELD_PREF_MAPPED, JOB_FACTOR_MAPPED, JOB_ASPIRATION_GROUPED] Index: []
# Kiểm tra giá trị duy nhất mỗi cột
print("\n🔢 Số lượng giá trị unique:")
print(df.nunique())
🔢 Số lượng giá trị unique: Timestamp 373 EMAIL 381 ID 379 GENDER 3 SEMESTER 10 MAJOR 17 GPA 53 SALARY_EXPECT 4 AFTER_GRAD 5 COUNTRY_PREF 14 PROJECT_STYLE 2 WORK_STYLE 2 STRENGTH 4 CODE_LEVEL 5 LANGUAGES 4 FIELD_PREF_MAPPED 6 JOB_FACTOR_MAPPED 6 JOB_ASPIRATION_GROUPED 7 dtype: int64
Thống kê mô tả¶
# Cho các cột số
print("\n📊 Thống kê mô tả cho biến số:")
print(df.describe().round(3))
# Cho các cột dạng object
print("\n📋 Thống kê mô tả cho biến phân loại:")
print(df.describe(include=['object']))
📊 Thống kê mô tả cho biến số:
SEMESTER GPA SALARY_EXPECT CODE_LEVEL
count 383.000 383.000 3.830000e+02 383.000
mean 2.760 5.650 1.591384e+07 1.979
std 1.634 2.956 4.274653e+06 1.061
min 0.000 0.000 5.000000e+06 1.000
25% 2.000 5.158 1.500000e+07 1.000
50% 3.000 6.000 1.500000e+07 2.000
75% 3.000 7.975 2.000000e+07 3.000
max 9.000 10.000 2.000000e+07 5.000
📋 Thống kê mô tả cho biến phân loại:
Timestamp EMAIL ID GENDER \
count 383 383 383 383
unique 373 381 379 3
top 9/29/2025 14:16:53 steve23121993@gmail.com SE204881 Nam
freq 2 2 2 336
MAJOR AFTER_GRAD \
count 383 383
unique 17 5
top Kỹ thuật phần mềm Vừa làm vừa học thêm chứng chỉ/chuyên môn
freq 208 176
COUNTRY_PREF PROJECT_STYLE WORK_STYLE \
count 383 383 383
unique 14 2 2
top Đa quốc gia Nhóm Nhóm
freq 211 247 292
STRENGTH LANGUAGES \
count 383 383
unique 4 4
top Kỹ năng mềm (teamwork, thuyết trình, quản lý) Đa ngôn ngữ
freq 141 288
FIELD_PREF_MAPPED JOB_FACTOR_MAPPED JOB_ASPIRATION_GROUPED
count 383 383 383
unique 6 6 7
top Kỹ thuật phần mềm Thu nhập Phát triển phần mềm
freq 307 154 218
Visualization¶
# Cấu hình hiển thị
sns.set(style="whitegrid", palette="pastel", font_scale=1.1)
# Phân loại cột
num_cols = df.select_dtypes(include=['int64', 'float64']).columns
cat_cols = df.select_dtypes(exclude=['int64', 'float64']).columns
print("📊 Tổng số cột số:", len(num_cols))
print("📋 Tổng số cột phân loại:", len(cat_cols))
# ===== 1️⃣ Vẽ biểu đồ cho các cột số =====
for col in num_cols:
plt.figure(figsize=(7,4))
sns.histplot(df[col], kde=True, bins=15, color="skyblue")
plt.title(f"Phân phối của {col}")
plt.xlabel(col)
plt.ylabel("Tần suất")
plt.tight_layout()
plt.show()
# ===== 2️⃣ Vẽ biểu đồ cho các cột phân loại =====
for col in cat_cols:
plt.figure(figsize=(max(10, len(df[col].unique()) * 0.6), 5))
value_counts = df[col].value_counts()
sns.barplot(x=value_counts.index, y=value_counts.values, color="lightcoral")
plt.title(f"Tần suất xuất hiện của {col}")
plt.xticks(rotation=45, ha='right')
plt.ylabel("Số lượng")
plt.xlabel(col)
plt.tight_layout()
plt.show()
📊 Tổng số cột số: 4 📋 Tổng số cột phân loại: 14
Correlation¶
plt.figure(figsize=(6,4))
sns.heatmap(df.corr(numeric_only=True), annot=True, cmap='Blues')
plt.title("Ma trận tương quan giữa các biến số")
plt.show()
Truy Vấn¶
Nhóm 2: xem những câu vấn đề này:
Phân bố GPA theo giới tính và kỳ học → Mô tả xem GPA trung bình có khác biệt giữa nam/nữ, và có xu hướng thay đổi theo số kỳ đã học không.
Mối quan hệ giữa GPA và lĩnh vực IT mong muốn chọn → Sinh viên có GPA cao thường chọn lĩnh vực nào (AI, Game Dev, Web, Security, v.v.)?
Ước mơ nghề nghiệp và kỹ năng code (self-rating) → Liệu những bạn chọn công việc "Backend Dev" thường tự đánh giá Level code cao hơn "UI/UX Designer" hay không?
Yếu tố quan trọng nhất khi chọn công việc vs mức lương mong muốn → Những sinh viên coi trọng "Cơ hội học hỏi" có mức lương mong muốn khác so với những người coi trọng "Lương cao" không?
Làm việc cá nhân vs team ở trường vs mong muốn khi đi làm → So sánh xu hướng: sinh viên thích làm project cá nhân ở trường thì ra trường có muốn startup độc lập không?
So sánh lương mong muốn theo chuyên ngành học hiện tại → Sinh viên ngành AI có mức lương mong muốn khác biệt thế nào so với ngành Web/Software Engineering?
Xu hướng quốc gia làm việc mong muốn vs GPA → Sinh viên muốn ra nước ngoài (Mỹ, Nhật, Singapore) có GPA cao hơn trung bình so với những bạn muốn làm trong nước không?
Ngôn ngữ lập trình thành thạo vs job mơ ước → Những bạn thành thạo Python có xu hướng chọn AI/Data Scientist nhiều hơn? Những bạn thành thạo C++ có thiên hướng Game Dev?
Phân tích sự tương quan giữa GPA và level code → GPA cao có đồng nghĩa với việc tự đánh giá khả năng code cũng cao (Level 4–5)?
TRUY VẤN VỚI SQL
import sqlite3
import os
# Thiết lập kết nối SQLite trong bộ nhớ (in-memory)
try:
conn = sqlite3.connect(':memory:')
# Ghi DataFrame vào một bảng tạm thời trong SQL, đặt tên bảng là 'data'
# index=False: không lưu index của Pandas vào SQL
df.to_sql('data', conn, if_exists='replace', index=False)
print("Đã tạo bảng 'data' trong SQLite thành công.")
except FileNotFoundError:
print(f"LỖI: Không tìm thấy file {FILE_NAME}. Vui lòng đảm bảo file nằm cùng thư mục với script Python.")
exit()
except Exception as e:
print(f"LỖI trong quá trình thiết lập: {e}")
exit()
# Hàm trợ giúp để chạy truy vấn và in kết quả
def run_sql_query(query, description):
print(f"\n=============================================")
print(f"{description}")
print(f"=============================================")
try:
result_df = pd.read_sql_query(query, conn)
# Sử dụng to_string để đảm bảo hiển thị đủ nội dung
print(result_df.to_string(index=False))
except Exception as e:
print(f"LỖI SQL: {e}")
Đã tạo bảng 'data' trong SQLite thành công.
# 1. Truy vấn: Kỳ vọng Lương trung bình (SALARY_EXPECT) theo Chuyên ngành (MAJOR)
q1 = """
SELECT
MAJOR,
AVG(SALARY_EXPECT) AS Avg_Expected_Salary
FROM
data
GROUP BY
MAJOR
ORDER BY
Avg_Expected_Salary DESC;
"""
run_sql_query(q1, "1. [SQL] Lương trung bình mong muốn theo Chuyên ngành")
=============================================
1. [SQL] Lương trung bình mong muốn theo Chuyên ngành
=============================================
MAJOR Avg_Expected_Salary
Truyền thông đa phương tiện 2.000000e+07
Truyền thông 2.000000e+07
Thiết kế đồ họa 2.000000e+07
Digital marketing 2.000000e+07
Vi mạch 1.785714e+07
Khác 1.777778e+07
An toàn thông tin 1.770833e+07
hệ thống thông tin 1.750000e+07
Trí tuệ nhân tạo 1.585938e+07
Kỹ thuật phần mềm 1.550481e+07
Kĩ thuật phần mềm 1.500000e+07
Hệ thống thông tin 1.500000e+07
Hệ thống dữ liệu 1.500000e+07
Hệ Thống Thông Tin 1.500000e+07
Công nghệ ô tô số 1.500000e+07
Hệ thống thông tin 1.416667e+07
Thiết kế mỹ thuật số 1.000000e+07
# 3. Truy vấn: Tỉ lệ sinh viên tự đánh giá trình độ Code giỏi (CODE_LEVEL >= 4)
q3 = """
SELECT
(CAST(SUM(CASE WHEN CODE_LEVEL >= 4 THEN 1 ELSE 0 END) AS REAL) * 100 / COUNT(*)) AS Percentage_Level_4_Plus
FROM
data;
"""
run_sql_query(q3, "3. [SQL] Tỉ lệ sinh viên tự đánh giá trình độ Code giỏi (Level >= 4)")
=============================================
3. [SQL] Tỉ lệ sinh viên tự đánh giá trình độ Code giỏi (Level >= 4)
=============================================
Percentage_Level_4_Plus
6.005222
# 4. Truy vấn: Top 5 Yếu tố Công việc quan trọng nhất (JOB_FACTOR_MAPPED)
q4 = """
SELECT
JOB_FACTOR_MAPPED,
COUNT(*) AS Count
FROM
data
GROUP BY
JOB_FACTOR_MAPPED
ORDER BY
Count DESC
LIMIT 5;
"""
run_sql_query(q4, "4. [SQL] Top 5 Yếu tố Công việc quan trọng nhất")
=============================================
4. [SQL] Top 5 Yếu tố Công việc quan trọng nhất
=============================================
JOB_FACTOR_MAPPED Count
Thu nhập 154
Đam mê bản thân 79
Cơ hội thăng tiến 50
Sự ổn định 47
Môi trường chuyên nghiệp 41
# 5. Truy vấn: Phân biệt GPA giữa sinh viên muốn làm việc Trong Nước vs. Nước Ngoài
q5 = """
SELECT
CASE WHEN COUNTRY_PREF LIKE '%Việt Nam%' THEN 'Trong Nước' ELSE 'Nước Ngoài' END AS Location,
AVG(GPA) AS Avg_GPA
FROM
data
GROUP BY
Location;
"""
run_sql_query(q5, "5. [SQL] So sánh GPA trung bình: Trong Nước vs. Nước Ngoài")
============================================= 5. [SQL] So sánh GPA trung bình: Trong Nước vs. Nước Ngoài ============================================= Location Avg_GPA Nước Ngoài 5.514611 Trong Nước 5.976987
# 6. Truy vấn: Chuyên ngành nào có nhiều sinh viên mong muốn mức lương tối đa nhất (20000000)
q6 = """
SELECT
MAJOR,
COUNT(*) AS Count
FROM
data
WHERE
SALARY_EXPECT = 20000000
GROUP BY
MAJOR
ORDER BY
Count DESC;
"""
run_sql_query(q6, "6. [SQL] Chuyên ngành có nhiều sinh viên mong muốn lương 20 triệu nhất")
=============================================
6. [SQL] Chuyên ngành có nhiều sinh viên mong muốn lương 20 triệu nhất
=============================================
MAJOR Count
Kỹ thuật phần mềm 85
Trí tuệ nhân tạo 29
Vi mạch 18
An toàn thông tin 15
Hệ thống thông tin 9
Khác 7
Thiết kế đồ họa 2
hệ thống thông tin 1
Truyền thông đa phương tiện 1
Truyền thông 1
Hệ thống thông tin 1
Digital marketing 1
# 7. Truy vấn: Mức độ tự tin về Kỹ năng mềm (STRENGTH) của sinh viên Nữ so với Nam
q7 = """
SELECT
GENDER,
COUNT(*) AS Soft_Skill_Count
FROM
data
WHERE
STRENGTH = 'Kỹ năng mềm (teamwork, thuyết trình, quản lý)'
GROUP BY
GENDER;
"""
run_sql_query(q7, "7. [SQL] Số lượng sinh viên chọn Kỹ năng mềm là điểm mạnh theo Giới tính")
=============================================
7. [SQL] Số lượng sinh viên chọn Kỹ năng mềm là điểm mạnh theo Giới tính
=============================================
GENDER Soft_Skill_Count
Không muốn nêu cụ thể 4
Nam 115
Nữ 22
# 8. Truy vấn: Mức lương trung bình theo phong cách làm việc mong muốn (WORK_STYLE)
q8 = """
SELECT
WORK_STYLE,
AVG(SALARY_EXPECT) AS Avg_Expected_Salary
FROM
data
GROUP BY
WORK_STYLE;
"""
run_sql_query(q8, "8. [SQL] Lương trung bình mong muốn theo Phong cách làm việc")
=============================================
8. [SQL] Lương trung bình mong muốn theo Phong cách làm việc
=============================================
WORK_STYLE Avg_Expected_Salary
Cá nhân 1.549451e+07
Nhóm 1.604452e+07
# 9. Truy vấn: GPA trung bình của nhóm sinh viên có kỳ vọng lương cao (>= 15 triệu)
q9 = """
SELECT
AVG(GPA) AS Avg_GPA_High_Salary_Expectation,
COUNT(*) AS Count
FROM
data
WHERE
SALARY_EXPECT >= 15000000;
"""
run_sql_query(q9, "9. [SQL] GPA trung bình của sinh viên kỳ vọng lương >= 15 triệu")
=============================================
9. [SQL] GPA trung bình của sinh viên kỳ vọng lương >= 15 triệu
=============================================
Avg_GPA_High_Salary_Expectation Count
5.664316 294
# 10. Truy vấn: Top 5 sinh viên có GPA cao nhất và Lĩnh vực (FIELD_PREF_MAPPED) họ ưu tiên
q10 = """
SELECT
GENDER,
MAJOR,
GPA,
FIELD_PREF_MAPPED
FROM
data
ORDER BY
GPA DESC
LIMIT 5;
"""
run_sql_query(q10, "10. [SQL] Top 5 sinh viên GPA cao nhất và Lĩnh vực ưu tiên")
# Đóng kết nối database sau khi hoàn tất
conn.close()
print("\n--- Hoàn tất truy vấn SQL. Đã đóng kết nối database. ---")
============================================= 10. [SQL] Top 5 sinh viên GPA cao nhất và Lĩnh vực ưu tiên ============================================= GENDER MAJOR GPA FIELD_PREF_MAPPED Nam Trí tuệ nhân tạo 10.0 Khác Nam Trí tuệ nhân tạo 10.0 Kỹ thuật phần mềm Nam An toàn thông tin 10.0 Kỹ thuật phần mềm Nam Kỹ thuật phần mềm 10.0 Kỹ thuật phần mềm Nam An toàn thông tin 10.0 Kỹ thuật phần mềm --- Hoàn tất truy vấn SQL. Đã đóng kết nối database. ---
Truy vấn với Python
# --- 1. GPA trung bình theo giới tính ---
avg_gpa_gender = df.groupby('GENDER')['GPA'].mean()
print("GPA trung bình theo giới tính:")
print(avg_gpa_gender)
# --- 2. GPA trung bình theo giới tính và kỳ học ---
avg_gpa_semester_gender = df.groupby(['SEMESTER', 'GENDER'])['GPA'].mean().reset_index()
print("\nGPA trung bình theo giới tính và kỳ học:")
print(avg_gpa_semester_gender)
# --- 3. Vẽ biểu đồ ---
plt.figure(figsize=(10,6))
sns.lineplot(
data=avg_gpa_semester_gender,
x='SEMESTER',
y='GPA',
hue='GENDER',
marker='o'
)
plt.title('GPA trung bình theo giới tính và kỳ học')
plt.xlabel('Số kỳ học')
plt.ylabel('GPA trung bình')
plt.xticks(avg_gpa_semester_gender['SEMESTER'].unique())
plt.grid(True)
plt.show()
GPA trung bình theo giới tính:
GENDER
Không muốn nêu cụ thể 6.000000
Nam 5.667755
Nữ 5.408323
Name: GPA, dtype: float64
GPA trung bình theo giới tính và kỳ học:
SEMESTER GENDER GPA
0 0 Không muốn nêu cụ thể 8.200000
1 0 Nam 1.666667
2 1 Không muốn nêu cụ thể 0.000000
3 1 Nam 1.838571
4 1 Nữ 0.888889
5 2 Không muốn nêu cụ thể 7.000000
6 2 Nam 6.558849
7 2 Nữ 6.735171
8 3 Không muốn nêu cụ thể 6.300000
9 3 Nam 6.950947
10 3 Nữ 7.491120
11 4 Không muốn nêu cụ thể 6.000000
12 4 Nam 6.860150
13 4 Nữ 7.000000
14 5 Không muốn nêu cụ thể 7.600000
15 5 Nam 6.688220
16 5 Nữ 6.063137
17 6 Nam 6.666961
18 7 Nam 7.266667
19 8 Nam 7.400000
20 9 Nam 7.442974
#2. Mối quan hệ giữa GPA và lĩnh vực IT mong muốn chọn
#→ Sinh viên có GPA cao thường chọn lĩnh vực nào (AI, Game Dev, Web, Security, v.v.)?
gpa_field_ref_mapped = df[df['GPA'] > 9][['FIELD_PREF_MAPPED', 'GPA']].sort_values(by ='GPA', ascending = False)
print(gpa_field_ref_mapped)
field_counts = gpa_field_ref_mapped['FIELD_PREF_MAPPED'].value_counts().reset_index()
field_counts.columns = ['FIELD_PREF_RAW', 'count']
print(field_counts)
FIELD_PREF_MAPPED GPA
10 Khác 10.00
11 Kỹ thuật phần mềm 10.00
18 Kỹ thuật phần mềm 10.00
35 Kỹ thuật phần mềm 10.00
66 Kỹ thuật phần mềm 10.00
380 Kỹ thuật phần mềm 10.00
97 Khác 10.00
187 Kỹ thuật phần mềm 10.00
136 Kỹ thuật phần mềm 10.00
193 Kỹ thuật phần mềm 10.00
314 Kỹ thuật phần mềm 10.00
263 Kỹ thuật phần mềm 10.00
257 Kỹ thuật phần mềm 10.00
339 Kỹ thuật phần mềm 10.00
375 Kỹ thuật phần mềm 9.50
19 Kỹ thuật phần mềm 9.20
67 An toàn thông tin 9.20
357 Khác 9.20
186 Khác 9.20
86 Kỹ thuật phần mềm 9.10
361 Kỹ thuật phần mềm 9.09
FIELD_PREF_RAW count
0 Kỹ thuật phần mềm 16
1 Khác 4
2 An toàn thông tin 1
#4. Yếu tố quan trọng nhất khi chọn công việc vs mức lương mong muốn
#→ Những sinh viên coi trọng "Cơ hội học hỏi" "Môi trường chuyên nghiệp" có mức lương mong muốn khác so với những người coi trọng "Lương cao" không?
chance_income = df[df['JOB_FACTOR_MAPPED'] == 'Môi trường chuyên nghiệp'][['JOB_FACTOR_MAPPED','SALARY_EXPECT']]
count_c_i = chance_income.groupby(['JOB_FACTOR_MAPPED','SALARY_EXPECT']).size().reset_index(name='count')
print(count_c_i)
incomepriotizer_income = df[df['JOB_FACTOR_MAPPED'] == 'Thu nhập'][['JOB_FACTOR_MAPPED','SALARY_EXPECT']]
count_i_i = incomepriotizer_income.groupby(['JOB_FACTOR_MAPPED','SALARY_EXPECT']).size().reset_index(name='count')
print(count_i_i)
JOB_FACTOR_MAPPED SALARY_EXPECT count 0 Môi trường chuyên nghiệp 10000000 8 1 Môi trường chuyên nghiệp 15000000 17 2 Môi trường chuyên nghiệp 20000000 16 JOB_FACTOR_MAPPED SALARY_EXPECT count 0 Thu nhập 5000000 4 1 Thu nhập 10000000 27 2 Thu nhập 15000000 42 3 Thu nhập 20000000 81
cross_tab = pd.crosstab(df['JOB_FACTOR_MAPPED'], df['SALARY_EXPECT'])
cross_tab = cross_tab.loc[['Môi trường chuyên nghiệp','Thu nhập']]
print(cross_tab)
SALARY_EXPECT 5000000 10000000 15000000 20000000 JOB_FACTOR_MAPPED Môi trường chuyên nghiệp 0 8 17 16 Thu nhập 4 27 42 81
# 5.Làm việc cá nhân vs team ở trường vs mong muốn khi đi làm
#→ So sánh xu hướng: sinh viên thích làm project cá nhân ở trường thì ra trường có muốn startup độc lập không?
cross_tab = pd.crosstab(df['PROJECT_STYLE'], df['WORK_STYLE'])
print(cross_tab)
WORK_STYLE Cá nhân Nhóm PROJECT_STYLE Cá nhân 60 76 Nhóm 31 216
#6.So sánh lương mong muốn theo chuyên ngành học hiện tại
#→ Sinh viên ngành AI có mức lương mong muốn khác biệt thế nào so với ngành Web/Software Engineering(Percentage)?
cross_tab = pd.crosstab(
df['MAJOR'],
df['SALARY_EXPECT'],
normalize='index'
) * 100
# Chỉ lấy hai ngành AI và Web/Software Engineering
cross_tab = cross_tab.loc[['Trí tuệ nhân tạo', 'Kỹ thuật phần mềm']]
print(cross_tab.round(1))
SALARY_EXPECT 5000000 10000000 15000000 20000000 MAJOR Trí tuệ nhân tạo 4.7 18.8 31.2 45.3 Kỹ thuật phần mềm 2.9 25.0 31.2 40.9
#7.Xu hướng quốc gia làm việc mong muốn vs GPA
#Sinh viên muốn ra nước ngoài (Mỹ, Nhật, Singapore) có GPA cao hơn trung bình so với những bạn muốn làm trong nước không?
df_not_zero = df[df["GPA"] > 0]
vn_mean = df_not_zero[df_not_zero["COUNTRY_PREF"].str.contains("Việt Nam", case=False, na=False)]["GPA"].mean()
# GPA trung bình của nhóm còn lại
others_mean = df_not_zero[~df_not_zero["COUNTRY_PREF"].str.contains("Việt Nam", case=False, na=False)]["GPA"].mean()
print("GPA trung bình - Việt Nam:", round(vn_mean, 2))
print("GPA trung bình - Nước ngoài:", round(others_mean, 2))
plt.bar(["Việt Nam", "Nước ngoài"], [vn_mean, others_mean], color=["#5DADE2", "#58D68D"])
plt.ylabel("Mean GPA")
plt.title("So sánh GPA trung bình: Việt Nam vs Nước ngoài")
plt.show()
GPA trung bình - Việt Nam: 6.83 GPA trung bình - Nước ngoài: 6.86
#8.Ngôn ngữ lập trình thành thạo vs job mơ ước
#→ Có sự khác biệt giữa nam và nữ mạnh về kỹ năng mềm hay chuyên môn hơn không?
# Bảng đếm tần suất theo giới tính và loại điểm mạnh
strength_table = df.groupby("GENDER")["STRENGTH"].value_counts(normalize=True).unstack(fill_value=0)*100
# Bổ sung thêm cột đếm số người chọn "Cả 2"
#strength_table["Số người chọn 'Cả 2'"] = df[df["STRENGTH"].str.contains("Cả", case=False, na=False)]["GENDER"].value_counts()
# Làm tròn và hiển thị
print(strength_table.round(1))
STRENGTH Cả 2 Cả 2 \ GENDER Không muốn nêu cụ thể 33.3 0.0 Nam 31.0 0.3 Nữ 26.3 0.0 STRENGTH Kỹ năng chuyên môn (lập trình, giải quyết kỹ thuật) \ GENDER Không muốn nêu cụ thể 22.2 Nam 34.5 Nữ 15.8 STRENGTH Kỹ năng mềm (teamwork, thuyết trình, quản lý) GENDER Không muốn nêu cụ thể 44.4 Nam 34.2 Nữ 57.9
#9.Phân tích sự tương quan giữa GPA và level code
#→ GPA cao có đồng nghĩa với việc tự đánh giá khả năng code cũng cao (Level 4–5)?
# Lọc dữ liệu hợp lệ (GPA > 0 và không NaN)
df_valid = df[df["GPA"] > 0]
# Xác định ngưỡng GPA cao (ví dụ > 7)
high_gpa = df_valid[df_valid["GPA"] > 7]
low_gpa = df_valid[df_valid["GPA"] <= 7]
# Tính tỉ lệ người có code level 4–5 trong mỗi nhóm
high_ratio = (high_gpa["CODE_LEVEL"] >= 4).mean() * 100
low_ratio = (low_gpa["CODE_LEVEL"] >= 4).mean() * 100
print(f"Tỉ lệ sinh viên GPA cao có code level ≥4: {high_ratio:.2f}%")
print(f"Tỉ lệ sinh viên GPA thấp hơn có code level ≥4: {low_ratio:.2f}%")
# Vẽ biểu đồ
import matplotlib.pyplot as plt
plt.bar(["GPA > 7", "GPA ≤ 7"], [high_ratio, low_ratio], color=["#5DADE2", "#58D68D"])
plt.ylabel("Tỉ lệ (%) có Code Level ≥4")
plt.title("So sánh giữa GPA cao và trình độ code tự đánh giá")
plt.show()
Tỉ lệ sinh viên GPA cao có code level ≥4: 10.34% Tỉ lệ sinh viên GPA thấp hơn có code level ≥4: 4.68%